/*
 * CodigoPostal.java
 *
 * Created on 14 de Maio de 2007, 18:03
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package pt.iscte.dcti.es.rhplus.sistema;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Hashtable;

import pt.iscte.dcti.es.rhplus.sistema.persistencia.AcessoBD;

/**
 * 
 * @author Gustavo Cabral
 * @author Helena Monteiro
 * @author Joao Catarino
 * @author Tiago Moreiras
 */
public class CodigoPostal {

	/** Creates a new instance of CodigoPostal */
	public CodigoPostal(final int id_codigo_postal, final int prefixo, final int sufixo, final String localidade) {
		this.id_codigo_postal = id_codigo_postal;
		this.prefixo = prefixo;
		this.sufixo = sufixo;
		this.localidade = localidade;
	}

	public int getIdCodigoPostal() {
		return id_codigo_postal;
	}

	public int getPrefixo() {
		return prefixo;
	}

	public void setPrefixo(final int prefixo) {
		this.prefixo = prefixo;
	}

	public int getSufixo() {
		return sufixo;
	}

	public void setSufixo(final int sufixo) {
		this.sufixo = sufixo;
	}

	public String getLocalidade() {
		return localidade;
	}

	public void setLocalidade(final String localidade) {
		this.localidade = localidade;
	}

	public String getRepresentacaoCurta() {
		return prefixo + " - " + sufixo;
	}

	public static CodigoPostal devolve(final int id_codigo_postal) throws SQLException, ClassNotFoundException, InstantiationException,
			IllegalAccessException {

		// Consulta a BD
		AcessoBD acesso_bd = new AcessoBD();
		acesso_bd.carregaDriverEAbreLigacao();
		String qryName = new String("devolver_codigo_postal_por_id");
		Hashtable<String, Object> dados_do_codigo_postal = new Hashtable<String, Object>();
		dados_do_codigo_postal.put("var_id_codigo_postal", id_codigo_postal);
		ResultSet result_set = acesso_bd.executaSelect(qryName, dados_do_codigo_postal);

		result_set.next();

		int prefixo = result_set.getInt("prefixo");
		int sufixo = result_set.getInt("sufixo");
		String localidade = result_set.getString("localidade");

		acesso_bd.fechaLigacao();

		CodigoPostal codigo_postal = new CodigoPostal(id_codigo_postal, prefixo, sufixo, localidade);

		return codigo_postal;
	}

	public static CodigoPostal devolve(final int prefixo, final int sufixo) throws SQLException, ClassNotFoundException, InstantiationException,
			IllegalAccessException {

		// Consulta a BD
		AcessoBD acesso_bd = new AcessoBD();
		acesso_bd.carregaDriverEAbreLigacao();
		String qryName = new String("devolver_codigo_postal_por_prefixo_e_sufixo");
		Hashtable<String, Object> dados_do_codigo_postal = new Hashtable<String, Object>();
		dados_do_codigo_postal.put("var_prefixo_codigo_postal", prefixo);
		dados_do_codigo_postal.put("var_sufixo_codigo_postal", sufixo);
		ResultSet result_set = acesso_bd.executaSelect(qryName, dados_do_codigo_postal);

		result_set.next();

		int id_codigo_postal = result_set.getInt("id_codigo_postal");
		String localidade = result_set.getString("localidade");

		acesso_bd.fechaLigacao();

		CodigoPostal codigo_postal = new CodigoPostal(id_codigo_postal, prefixo, sufixo, localidade);

		return codigo_postal;
	}

	public static void insere(final Hashtable<String, Object> dados_do_codigo_postal) throws SQLException, ClassNotFoundException,
			InstantiationException, IllegalAccessException {

		AcessoBD acesso_bd = new AcessoBD();
		acesso_bd.carregaDriverEAbreLigacao();
		String qryName = new String("inserir_codigo_postal");
		acesso_bd.executaUpdate(qryName, dados_do_codigo_postal);
		acesso_bd.fechaLigacao();
	}

	public static void remove(final int id_codigo_postal) throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {

		AcessoBD acesso_bd = new AcessoBD();
		acesso_bd.carregaDriverEAbreLigacao();
		String qryName = new String("remover_codigo_postal");
		Hashtable<String, Object> dados_da_pessoa = new Hashtable<String, Object>();
		dados_da_pessoa.put("var_id_codigo_postal", new Integer(id_codigo_postal));

		acesso_bd.executaUpdate(qryName, dados_da_pessoa);
		acesso_bd.fechaLigacao();

	}

	public static void altera(final Hashtable<String, Object> dados_do_codigo_postal) throws SQLException, ClassNotFoundException,
			InstantiationException, IllegalAccessException {
		AcessoBD acesso_bd = new AcessoBD();
		acesso_bd.carregaDriverEAbreLigacao();
		String qryName = new String("alterar_codigo_postal");
		acesso_bd.executaUpdate(qryName, dados_do_codigo_postal);
		acesso_bd.fechaLigacao();
	}

	public static int devolveUltimoIdentificadorDeInsercao() throws SQLException, ClassNotFoundException, InstantiationException,
			IllegalAccessException {
		AcessoBD acesso_bd = new AcessoBD();
		acesso_bd.carregaDriverEAbreLigacao();
		String qryName = new String("devolver_ultimo_id_de_codigo_postal");
		ResultSet result_set = acesso_bd.executaSelect(qryName, null);
		result_set.next();
		int ultimo_id_codigo_postal = result_set.getInt("ultimo_id");
		acesso_bd.fechaLigacao();
		return ultimo_id_codigo_postal;
	}

	public static boolean existe(final int prefixo, final int sufixo) throws SQLException, ClassNotFoundException, InstantiationException,
			IllegalAccessException {

		// Consulta a BD
		AcessoBD acesso_bd = new AcessoBD();
		acesso_bd.carregaDriverEAbreLigacao();
		String qryName = new String("devolver_codigo_postal_por_prefixo_e_sufixo");
		Hashtable<String, Object> dados_do_codigo_postal = new Hashtable<String, Object>();
		dados_do_codigo_postal.put("var_prefixo_codigo_postal", prefixo);
		dados_do_codigo_postal.put("var_sufixo_codigo_postal", sufixo);
		ResultSet result_set = acesso_bd.executaSelect(qryName, dados_do_codigo_postal);

		return result_set.next();
	}

	public void gravaParaBaseDeDados() throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
		CodigoPostal.altera(toHashtable());
	}

	public String toString() {
		return "CodigoPostal[" + id_codigo_postal + "] : " + prefixo + "-" + sufixo + " " + localidade;
	}

	public Hashtable<String, Object> toHashtable() {
		Hashtable<String, Object> dados_do_codigo_postal = new Hashtable<String, Object>();

		dados_do_codigo_postal.put("var_id_codigo_postal", new Integer(this.getIdCodigoPostal()));
		dados_do_codigo_postal.put("var_prefixo", this.getPrefixo());
		dados_do_codigo_postal.put("var_sufixo", this.getSufixo());
		dados_do_codigo_postal.put("var_localidade", this.getLocalidade());

		return dados_do_codigo_postal;
	}

	private int id_codigo_postal;

	private int prefixo;

	private int sufixo;

	private String localidade;
}
